package yb.ecp.fast.user.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import yb.ecp.fast.infra.infra.log.LogHelper;
import yb.ecp.fast.infra.util.StringUtil;
import yb.ecp.fast.user.infra.ErrorCode;
import yb.ecp.fast.user.manager.UserContextManager;
import yb.ecp.fast.user.service.VO.ProfileVO;
import yb.ecp.fast.user.service.VO.UserCacheVO;

import java.util.List;

/**
 * Created by john on 2017/10/19.
 */
@Service
public class UserContextService {

    @Autowired
    private   UserContextManager userContextManager;

    @Autowired
    private  ScepterService scepterService;

    @Autowired
    private ProfileService profileService;

    /**
     * 默认admin管理员id
     */
    @Value("${role.admin.roleId}")
    private String roleAdminId;

    public void setSession(String userId,Object data, Integer[] codes,String workspaceId){
        userContextManager.cacheUser(userId,data,codes,workspaceId);
    }
    public ErrorCode checkAuthCode(String userId, Integer code)
    {
        if (this.ifAdmin(userId))
        {
            userContextManager.renewLeaseSession(userId);
            LogHelper.debug(userId+"用户为管理员，权限校验通过！");
            return ErrorCode.Success;
        }

        ErrorCode checkCode = userContextManager.checkAuthCode(userId, code);
        if (ErrorCode.Success == checkCode)
        {
            userContextManager.renewLeaseSession(userId);
            return ErrorCode.Success;
        }
        return checkCode;
    }

    /**
     *获取缓存中用户信息，如果为空，则查询数据库中用户信息，并缓存
     * @param userId String
     * @return Object
     */
    public Object getSessionData(String userId){
        UserCacheVO  obj = (UserCacheVO) userContextManager.getUserData(userId);
        if(null!=obj)
        {
            userContextManager.renewLeaseSession(userId);
            LogHelper.debug("获取用户缓存信息操作成功，刷新缓存！");
            return obj;
        }
        //缓存数据失效，重新查询用户信息，并添加到缓存数据库
        ProfileVO profileVO = setSession(userId);
        return profileService.getUserCacheVO(profileVO);
    }

    /**
     * 获取缓存中用户权限，如果为空，则查询数据库用户权限信息，并缓存
     * @param userId String
     * @return Integer[] 权限code
     */
    public Integer[] getAuthCodes(String userId)
    {
        Integer[] authIds = userContextManager.getAuthCode(userId);
        if (null != authIds && 0 != authIds.length)
        {
            userContextManager.renewLeaseSession(userId);
            LogHelper.debug("获取用户权限码操作成功，刷新缓存！");
            return authIds;
        }
        //缓存数据失效，重新查询用户信息，并添加到缓存数据库
        ProfileVO profileVO = setSession(userId);
        if(null==profileVO)
        {
            LogHelper.debug(userId+"获取用户权限码操作，用户信息不存在！");
            return new Integer[0];
        }
        return profileVO.getAuthIds().toArray(new Integer[0]);
    }

    /**
     * 获取缓存中的用户所属工作空间ID
     * @param userId String
     * @return String
     */
    public String getWorkspaceId(String userId)
    {
        String workspaceId = userContextManager.getWorkspaceId(userId);

        if(!StringUtil.isNullOrSpace(workspaceId))
        {
            userContextManager.renewLeaseSession(userId);
            LogHelper.debug("获取用户所属工作空间ID操作成功，刷新缓存！");
            return  workspaceId;
        }

        //缓存数据失效，重新查询用户信息，并添加到缓存数据库
        ProfileVO profileVO = setSession(userId);
        if(null==profileVO)
        {
            LogHelper.debug(userId+"获取用户所属工作空间操作，用户信息不存在！");
            return "";
        }
        return profileVO.getSpaceId();
    }

    public void clearSession(String userId){
        userContextManager.clearSession(userId);
    }
    /**
     * 用户是否有管理员权限<br />
     * 是管理员则返回TRUE
     * @param userId String
     * @return boolean
     */
    public  boolean ifAdmin(String userId)
    {
        List<String> roleIds = scepterService.getRoleIdsByUserId(userId);

        return roleIds.contains(roleAdminId);
    }

    /**
     * 用户缓存信息失效，查询数据库用户信息，并添加缓存
     * @param userId String
     * @return ProfileVO
     */
  public ProfileVO setSession(String userId)
    {
        return  profileService.queryLoginUser(userId);
    }
}
